/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package subCategoria;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.Session;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;

/**
 *
 * @author Alberto
 */
public class RepositorioSubCategoria implements IRepositorioSubCategoria {

    /**
     * Metodo que ira cadastrar o SubCategoria
     * 
     * @param SubCategoria objSubCategoria
     * @return void
     */
    public void cadastrarAtualizar(SubCategoria objSubCategoria) throws ErroAcessoRepositorioException {
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();

            s.saveOrUpdate(objSubCategoria);

            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
            //s.close();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
    }

    /**
     * Metodo que ira produrar o SubCategoria
     *
     * @param int idSubCategoria
     * @return void
     */
    public SubCategoria procurar(int idSubCategoria) throws SubCategoriaNaoCadastradoException, ErroAcessoRepositorioException {
        SubCategoria objSubCategoria = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();

            objSubCategoria = (SubCategoria) s.get(SubCategoria.class, idSubCategoria);

            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
            //s.close();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }

        return objSubCategoria;
    }
    
    /**
     * Metodo que ira listar os Categorias
     *
     * @return Collection
     */
    public List<SubCategoria> procurarPorDescricaoPorCategoria(String descricaoSubCategoria, int idCategoria) throws Exception, ErroAcessoRepositorioException {
        List<SubCategoria> listSubCategoria = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            // criando o sql
            String sql = "from SubCategoria WHERE id_sub_categoria IS NOT NULL ";
            if(descricaoSubCategoria.trim().length() > 0){
                sql += " AND nome LIKE :nome ";
            }
            if(idCategoria > 0){
                sql += " AND id_sub_categoria = :id_sub_categoria ";
            }
            // Criando a query
            Query q = s.createQuery(sql);
            if(descricaoSubCategoria.trim().length() > 0){
                q.setParameter("nome", "%" + descricaoSubCategoria + "%");
            }
            if(idCategoria > 0){
                q.setParameter("id_sub_categoria", idCategoria);
            }
            
            // Listando as categorias
            listSubCategoria = q.list();
            
            t.commit();
            
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
        return listSubCategoria;
    }

    /**
     * Metodo que ira verificar a existência do SubCategoria
     *
     * @param int idSubCategoria
     * @return void
     */
    public boolean existe(int idSubCategoria) throws ErroAcessoRepositorioException {
        SubCategoria objSubCategoria = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();

            objSubCategoria = (SubCategoria) s.get(SubCategoria.class, idSubCategoria);

            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
            //s.close();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }

        return (objSubCategoria != null);
    }

    /**
     * Metodo que ira listar os SubCategorias
     *
     * @return Collection
     */
    public List<SubCategoria> listar(String strComplemento) throws Exception, ErroAcessoRepositorioException {
        List<SubCategoria> listSubCategoria = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();

            // Recuperando a listagem das subcategorias
            Query q = s.createQuery("from SubCategoria WHERE id_sub_categoria IS NOT  NULL " + strComplemento);
            // Listando todas as subcategorias
            listSubCategoria = q.list();
            
            // Comtando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
            //s.close();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }

        return listSubCategoria;

    }
    
    /**
     * Metodo que ira listar os SubCategorias
     *
     * @return Collection
     */
    public List<SubCategoria> listarAtivo() throws Exception, ErroAcessoRepositorioException {
        String complemento = " AND status_sub_categoria = true ORDER BY id_sub_categoria";
        
        return this.listar(complemento);
    }

    /**
     * Método que ira remover o SubCategoria do banco
     * 
     * @param idSubCategoria
     */
    public void remover(int idSubCategoria) throws SubCategoriaNaoCadastradoException, ErroAcessoRepositorioException {
        Session s = null;
        Transaction t = null;
        if (this.existe(idSubCategoria)) {
            try {
                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();
               
                SubCategoria objSubCategoria = (SubCategoria) s.get(SubCategoria.class, idSubCategoria); 
                
                objSubCategoria.setStatusSubCategoria(false);
                
                s.saveOrUpdate(objSubCategoria);
                
                // Comtando tudo caso der certo
                t.commit();
                
            }catch (Exception e ) {
                t.rollback();
                //s.close();
                throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
            }
        }else    throw new SubCategoriaNaoCadastradoException();

    }
}
